package cn.wolfcode.ssm.util;

import cn.wolfcode.ssm.page.JsonPage;
import com.alibaba.fastjson.JSON;
import org.apache.shiro.authz.UnauthorizedException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.method.HandlerMethod;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@ControllerAdvice
public class ControllerExceptionHandler {

    // 贴这个标签用于捕获指定异常
    @ExceptionHandler(RuntimeException.class)
    public String handler(RuntimeException e, HttpServletResponse response, HandlerMethod method) throws IOException {
        e.printStackTrace();
        // 这里是否为ajax对应方法,判断是不是贴了ResponseBody注解 如果是就是返回一个JsonPage,
        if(method.hasMethodAnnotation(ResponseBody.class)){
            response.setContentType("application/json;charset=UTF-8");
            // 如果贴了ResponseBody注解 出现异常则返回一个Json
            response.getWriter().print(JSON.toJSONString(new JsonPage(false,"操作失败")));
            return null;
        }else{
            // 否则返回一个视图
            // 比如当查看员工界时候,后台Sql语句出现错误
            return "common/error";
        }

    }


    // 贴这个标签用于捕获指定异常(当访问者没有权限时候的异常)
    @ExceptionHandler(UnauthorizedException.class)
    public String UnauthorizedHandler(UnauthorizedException e, HttpServletResponse response, HandlerMethod method) throws IOException {
        e.printStackTrace();
        // 这里是否为ajax对应方法,判断是不是贴了ResponseBody注解 如果是就是返回一个JsonPage,
        if(method.hasMethodAnnotation(ResponseBody.class)){
            response.setContentType("application/json;charset=UTF-8");
            // 如果贴了ResponseBody注解 出现异常则返回一个Json
            response.getWriter().print(JSON.toJSONString(new JsonPage(false,"操作失败")));
            return null;
        }else{
            // 否则返回一个视图
            return "common/nopermission";
        }

    }
}
